package edu.tsinghua.lumaqq.qq.packets.in._08;

import java.nio.ByteBuffer;

import edu.tsinghua.lumaqq.qq._08QQ;
import edu.tsinghua.lumaqq.qq.Util;
import edu.tsinghua.lumaqq.qq.beans.QQUser;
import edu.tsinghua.lumaqq.qq.packets._08BasicInPacket;
import edu.tsinghua.lumaqq.qq.packets.PacketParseException;

/**
 * 登录回复包
 *
 * @author dream.seraph
 */
public class _08LoginReplyPacket extends _08BasicInPacket {

    public byte replyCode;
    public byte[] sessionKey;
    public byte[] ip;
    public char port;
    public byte serverIp[];
    public char serverPort;
    public long loginTime;
    public byte[] loginTimeRude;
    public long lastLoginTime;
    public String replyMessage;
    public byte[] clientKey;
    public byte[] lastLoginIp;
    public byte[] redirectIp;
    public int redirectPort;
    //本地主机名
    public byte[] localHost;
    // 认证令牌，用在一些需要认证身份的地方，比如网络硬盘
    public byte[] authToken;
    //用户的QQ号
    public byte[] userQQ;

    public _08LoginReplyPacket(ByteBuffer buf, int length, QQUser user)
            throws PacketParseException {
        super(buf, length, user);
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.packets._08InPacket#getPacketName()
     */
    @Override
    public String getPacketName() {
        return "07 Login Reply _08Packet";
    }

    @Override
    public byte[] getDecryptKey(byte[] body) {
        return user.getPasswordKey();
    }

    @Override
    public byte[] getFallbackDecryptKey(byte[] body) {
        return user.getLoginKey();
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.packets._08InPacket#parseBody(java.nio.ByteBuffer)
     */
    @Override
    protected void parseBody(ByteBuffer buf) throws PacketParseException {
        replyCode = buf.get();//登陆类型码

        switch (replyCode) {
            case _08QQ.QQ_REPLY_OK:
                sessionKey = new byte[_08QQ.QQ_LENGTH_KEY];
                buf.get(sessionKey);
                // 用户QQ号
                userQQ = new byte[4];
                buf.get(userQQ);
                // 用户IP
                ip = new byte[4];
                buf.get(ip);
                // 用户端口
                port = buf.getChar();
                //127.0.0.1
                localHost = new byte[4];
                buf.get(localHost);
                // 服务器的端口
                serverPort = buf.getChar();
                //本次登录的原始时间
                loginTimeRude = new byte[4];
                buf.get(loginTimeRude);
                // 本次登陆时间，为什么要乘1000？因为这个时间乘以1000才对，-_-!...
                loginTime = Util.getIntFromBytes(loginTimeRude, 0, 4) * 1000L;
                //跳过50个字节
                buf.position(buf.position() + 50);
                clientKey = new byte[32];
                buf.get(clientKey);
                //跳过12个字节
                buf.position(buf.position() + 12);
                //上次登录的IP
                lastLoginIp = new byte[4];
                buf.get(lastLoginIp);
                //上次登录的时间
                lastLoginTime = buf.getInt() * 1000L;
                break;
            case _08QQ.QQ_REPLY_LOGIN_FAIL://好像再也没这段了,被0x05命令代替了？
                // 登录失败，我们得到服务器发回来的消息	   

                byte[] b = buf.array();
                replyMessage = Util.getString(b, 1, b.length - 1, _08QQ.QQ_CHARSET_DEFAULT);
                break;
            case _08QQ.QQ_REPLY_LOGIN_REDIRECT:
                // 登陆重定向，可能是为了负载平衡
                // 用户QQ号
                buf.getInt();
                // 未知10字节，跳过
                buf.position(buf.position() + 10);
                //重定向到的服务器IP
                redirectIp = new byte[4];
                buf.get(redirectIp);
                // 使用缺省端口
                redirectPort = user.getPort();
                break;
            case _08QQ.QQ_LOGIN_FAIL://0x05登录失败

                log.debug("登录失败，可能是因为上线高峰吧，管他呢，继续登录！");
                break;
        }
    }
}
